package org.gwc.confic;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


/**
 * java的配置类，替代.xml文件
 *  1、包扫描注解配置,@ComponentScan({"org.gwc.ioc_01",""})
 *  2、引用外部的配置文件 @PropertySource(value = "classpath:jdbc.properties")
 *  3、声明第三方依赖的bean组件
 */
@ComponentScan({"org.gwc.ioc_01"})
@PropertySource(value = "classpath:jdbc.properties")
@Configuration
public class JavaConfiguration {

    @Value("${atguigu.url}")
    private String url;
    @Value("${atguigu.driver}")
    private String driverClassName;
    @Value("${atguigu.username}")
    private String username;
    @Value("${atguigu.password}")
    private String password;
    /**
     * <bean> -> 一个方法
     * 方法的返回类型 == bean组件的类型或者其他的接口和父类
     * 方法的名字 = bean id
     * 方法体可以自定义实现过程即可
     * 最重要一步,@Bean 会真正让配置类的方法创建的组件存储到ioc容器
     *
     * 问题1：beanName的问题
     *       默认：方法名
     *       指定：name/value属性起名字，覆盖方法名
     * 问题2: 周期方法如何指定
     *       原有解决方案：@PostConstruct +  @PreDestroy
     *       bean属性方案: initMethod + destroyMethod指定
     * 问题3：作用域
     *       和以前一样@Scope单例，多例指定
     * 问题4：如何调用其他的iol组件
     *       1、直接调用对方的Bean方法即可
     *       2、直接形参变量进行引入，要求必须有对应的组件，如果有多个，则需要指定形参名(组件id标识)
     *
     * @return
     */
    @Bean(name = "gwcDruidDataSource")
    public DruidDataSource druidDataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(url);
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }

    // 声明多个组件id标识
    @Bean(name = "gwc1DruidDataSource")
    public DruidDataSource druid1DataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(url);
        druidDataSource.setDriverClassName(driverClassName);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }

    // 通过调用函数来直接获取对象
    @Bean(value = "jdbcTemplate1")
    public JdbcTemplate jdbcTemplate1(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(druidDataSource());
        return jdbcTemplate;
    }

    // 通过形参来获取对象，当有多个组件id时，形参名需要指定具体某一个组件id
    // 这个比较常用
    @Bean(value = "jdbcTemplate2")
    public JdbcTemplate jdbcTemplate2(DruidDataSource gwcDruidDataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(gwcDruidDataSource);
        return jdbcTemplate;
    }



}
